package ObjectOriented;

/**
 * 抽象类：如果父类的方法本身不需要实现任何功能，仅仅是为了定义方法签名，目的是让子类去覆写它，那么，可以把父类的方法声明为抽象方法
   1、抽象方法本身没有任何方法语句
   2、抽象方法只能存在于抽象类中
   3、抽象类不能实例化，只能被继承
   4、抽象类可以包含属性和方法，也可以包含构造方法
   5、抽象类可以强迫子类实现其定义的抽象方法

   抽象编程：尽量引用高层类型，避免引用实际子类型的方式
      上层代码只定义规范（例如：abstract class Person）；
      不需要子类就可以实现业务逻辑（正常编译）；
      具体的业务逻辑由不同的子类实现，调用者并不关心。
 */
abstract class Person {
  public abstract void run();
}
class Student extends Person {
  @Override
  public void run() {
    System.out.println("Student.run");
  }
}

public class Abstract {
  public static void main(String[] args) {
    Person p = new Student();
    p.run();
  }
}
